﻿/**
 * nPnP - neither Perl not PHP
 *
 * Copyright (C) 2009 Christian Moeller
 *
 * This program is free software; you can redistribute it and/or modify it 
 * under the terms of the GNU General Public License as published by the 
 * Free Software Foundation; either version 3 of the License, or (at your option) 
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE. 
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program; 
 * if not, see <http://www.gnu.org/licenses/>.
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FParser.Executor;
using System.IO;
using FParser.Parser;
using System.Diagnostics;

namespace FParser.Runtime.Libraries
{
    class Lib_Core : IBaseLibrary
    {
        public ExternalLibraryCall[] Exports
        {
            get
            {
                return new ExternalLibraryCall[] { 
                    use,
                    exit,
                    process
                };
            }
        }

        public ExecutionResult exit(RuntimeScope scope)
        {
            ExecutionResult result = new ExecutionResult();
            Environment.Exit(0);
            return result;
        }

        public ExecutionResult process(RuntimeScope scope)
        {
            ExecutionResult result = new ExecutionResult();
            if (scope.HasParameter(1)) {
                try
                {
                    ProcessStartInfo pInfo = new ProcessStartInfo(scope.GetParameter(1));
                    Process process = Process.Start(pInfo);
                    process.WaitForExit();
                    result.sValue = BaseType.CreateAnonymous(process.ExitCode.ToString());
                }
                catch (Exception)
                {
                    result.sValue = BaseType.CreateAnonymous("-1");
                }
            }
            return result;
        }

        public ExecutionResult use(RuntimeScope scope)
        {
            ExecutionResult result = new ExecutionResult();
            if (scope.HasParameter(1))
            {
                string file = scope.GetParameter(1);

                if (File.Exists(file))
                {
                    StreamReader fio = new StreamReader(file);
                    string pdata = fio.ReadToEnd();

                    Tokenizer tokenizer = new Tokenizer(pdata);
                    List<Token> tokens = tokenizer.Tokenize(true);

                    TokenParser parser = new TokenParser(tokens);
                    List<Expression> expressions = parser.Parse();

                    Executor.Executor executor = new FParser.Executor.Executor(expressions);
                    executor.Scope = scope;
                    executor.Run();
                }
                else
                    result.State.Result = EnumExecutionResult.RUNTIME_ERROR;
            }
            return result;
        }
    }
}
